package san.java.day09;

/**
 * 内部类:
 *  内部类的作用:
 *      内部类主要是解决java不能多重继承的问题.
 *
 *  在java中,允许一个类的定义位于另一个类的内部,前者称为内部类,后者称为外部类
 *      1. 用在定义它的类或语句块之内, 在外部引用它时必须给出完整的名称
 *      2. Inner class的名字不能与包含他的类名相同
 *      3. Inner class 可以使用外部类的私有数据,因为它是外部类的成员；外部类也可以使用Inner class
 *          不过要使用InnerClass.成员来使用
 *  分类:
 *      成员内部类
 *      局部内部类
 *
 *  内部类的特性:
 *      1. 可以声明为final
 *      2. 和外部类不同, Inner class可声明为private或protected;
 *      3. Inner class 可以声明为static的,但此时就不能再使用外部类的非static成员变量
 *      4. 可以声明为抽象类,并被其他的内部类继承
 *
 *  注意:
 *      1. 非static的内部类中的成员不能声明为static的,只有在外部类或static的内部类中才可声明static成员
 */


class A {

    /**
     * 在A中同时使用类B和类C的方法
     */

    private InnerB innerB = new InnerB();
    private InnerC innerC = new InnerC();

    public void testB() {
        innerB.testB();
    }

    private class InnerB extends B{
        @Override
        public void testB() {
            System.out.println("类A之中重写的testB");
        }
    }

    private class InnerC extends C {
        @Override
        public void testC() {
            System.out.println("类A之中重写的testC");
        }
    }

    public static void main(String[] args) {
        A a = new A();
        a.testB();
    }

}

class B {
    public void testB() {

    }
}

class C {
    public void testC() {

    }

}

public class InnerClass_07 {

    int i;
    public int pub;
    private int pri;
//    String s1[], s2 = "";
    String[] s1, s2;  // 这两种定义方式还不一样

    class A {
        public void init() {
            InnerClass_07.this.i = 1;
            InnerClass_07.this.pub = 1;
            InnerClass_07.this.pri = 1;
        }
    }

    // 如果内部类是static的, 就不能使用外部类的非static成员
    private static final class B {

    }

    abstract class C {

    }

    class D extends C {

    }

    public void init() {
        new A().init();
    }

    public InnerClass_07() {
        init();
    }

    @Override
    public String toString() {
        return "InnerClass_07{" +
                "i=" + i +
                ", pub=" + pub +
                ", pri=" + pri +
                '}';
    }

    public static void main(String[] args) {
        InnerClass_07 innerClass_07 = new InnerClass_07();
        System.out.println(innerClass_07);
    }
}
